// //泛型
// //应用场景：泛型函数、泛型接口、泛型类

// //1-1.需求：封装函数，传入字符串，直接返回字符串
// function returnStr(arg:string):string{
// 	return arg
// }
// console.log(returnStr('hello'));

// //1-2.需求：封装函数，传入数字，直接返回数字
// function returnNum(arg:number):number{
// 	return arg
// }
// console.log(returnNum(123));

// //1-3.需求：封装函数，传入布尔，直接返回布尔

// //1-4.单泛型函数
// function returnItem<T>(arg:T):T{
// 	return arg
// }
// console.log(returnItem<string>('world'));

// //2-1.需求：封装函数，传入[7,'seven'],返回['seven',7]
// function swap1(arg:[number,string]):[string,number]{
// 	return [arg[1],arg[0]]
// }
// console.log(swap1([1,'666']));
// //2-2.需求：封装函数，传入[1,true],返回[true,1]
// function swap2(arg:[number,boolean]):[boolean,number]{
// 	return [arg[1],arg[0]]
// }
// console.log(swap2([1,true]));

// //2-3多泛型函数
// function sawp<T,U>(arg:[T,U]):[U,T]{
// 	return [arg[1],arg[0]]
// }
// console.log(sawp<number,string>([7,'seven']));

// //3-1需求：从服务端加载了一个带有商品数据的JSON包，请为他设定明确的类型约束
// //假设为某次get请求
// interface GoodType1 {
// 	name:string,
// 	price:number
// }
// interface DataType1 {
// 	results:Array<GoodType1>
// }
// interface ResType1 {
// 	status:number,
// 	data:DataType1
// }
// let res1:ResType1 = {
// 	status:200,
// 	data:{
// 		results:[
// 			{name:'轩辕剑',price:200},
// 			{name:'诛仙剑',price:20},
// 			{name:'木剑',price:2},
// 		]
// 	}
// }

// //3-2需求：为加载到的公司数据，给出明确类型约束
// interface CompanyType2{
// 	title:string,
// 	location:string
// }
// interface DataType2{
// 	results:Array<CompanyType2>
// }
// interface ResType2{
// 	status:number,
// 	data:DataType2
// }
// let res2:ResType<CompanyType2> = {
// 	status:200,
// 	data:{
// 		results:[
// 			{title:'腾训',location:'深圳'},
// 			{title:'阿里巴巴',location:'杭州'},
// 			{title:'字节跳动',location:'北京'},
// 		]
// 	}
// }
// //3-3 泛型接口封装
// interface DataType <T>{
// 	results:Array<T>
// }
// interface ResType <T>{
// 	status:number,
// 	data:DataType<T>
// }

// //3-4 为岗位数据添加明确类型约束
// interface JobType{
// 	jobname:string,
// 	salary:number
// }
// let res3:ResType<JobType> = {
// 	status:200,
// 	data:{
// 		results:[
// 			{jobname:'修为',salary:200},
// 			{jobname:'炼器',salary:200},
// 			{jobname:'炼丹',salary:200},
// 		]
// 	}
// }

// // 泛型约束
// type Param = string|number
// interface LimitType<T extends Param>{
// 	[index:number]:T
// }
// let strArr:LimitType<string> = ['1','2']
// let numArr:LimitType<number> = [1,2]
// // let boolArr:LimitType<boolean> = [true]//此处会报错

// // 泛型约束与索引类型一起使用
// // 需求:封装函数，接受两个参数[对象]，[键名]，期望以键名为条件成功提取对应的值

// let user = {name:'123',age:12}

// // function getValue(obj:object,key:string){
// // 	return obj[key]
// // }
// function getValue<T,U extends keyof T>(obj:T,key:U){
// 	return obj[key]
// }
// console.log(getValue(user,'age'));